package com.itheima.test_extends.demo05;
/*
        如果父类没有无参的构造方法，那么其子类能否有无参数的构造方法？为什么？
不能    当你new一个子类对象的时候，必须首先要new一个父类的对象出来，而这个父类对象肯定是位于子类对象的内部，
        子类对象里面包含了一个父类的对象，这是内存中真实的情况.构造方法是new一个对象的时候，必须要调的方法，这是规定，
        要new父类对象出来，那么肯定要调用其构造方法，一个类，如果我们不写构造方法，那么编译器会帮我们加上一个默认的构造方法，
        所谓默认的构造方法，就是无参构造方法，所以有时候当你new一个子类对象的时候，肯定调用了子类的构造方法，
        但是在子类构造方法中我们并没有显示的调用父类的构造方法，就是没写，如：super(); 并没有这样写，
        但是这样就会调用父类无参的构造方法，如果父类中没有无参构造方法就会出错。
        继承中构造方法调用次序

        当类存在继承关系时，创建该类对象，
        系统先创建父类对象，再创建该子类对象
        所以构造方法的调用次序是先父后子
*/


/*
如果父类没有无参构造方法，那么子类的构造方法会出现什么现象呢?
报错。
如何解决呢?
A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的带参构造方法
C:子类通过this去调用本类的其他构造方法
子类中一定要有一个去访问了父类的构造方法，否则父类数据就没有初始化。

注意事项：
this(...)或者super(...)必须出现在第一条语句上。
如果不是放在第一条语句上，就可能对父类的数据进行了多次初始化，所以必须放在第一条语句上。
*/
class Father {
/*
public Father() {
System.out.println("Father的无参构造方法");
}
*/

    public Father(String name) {
        System.out.println("Father的带参构造方法");
    }
}


class Son extends Father {
    public Son() {
        super("随便给");
        System.out.println("Son的无参构造方法");
//super("随便给");
    }

    public Son(String name) {
//super("随便给");
        this();
        System.out.println("Son的带参构造方法");
    }
}


class ExtendsDemo7 {
    public static void main(String[] args) {
        Son s = new Son();
        System.out.println("----------------");
        Son ss = new Son("林青霞");
    }
}


